﻿// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'

Shader"Qs/MyShaderfour"{
	Properties{
		_Diffuse("Diffuse Coror",Color) = (1,1,1,1)
	}
	SubShader{
		  Pass{

		  Tags{ "LightMode" = "ForwardBase" }

				CGPROGRAM

	#include"Lighting.cginc"//取得第一个直射光的颜色 _LightColor0 第一个直射光的位置_WorldSpaceLightPos0
	#pragma vertex vert
	#pragma fragment frag

	        	fixed4 _Diffuse;

				//application to vertex//使用结构体传递数据//使用结构体返回数据，这样可以返回很多个值
		        //结构体
				struct a2v {
				float4 vertex : POSITION;//位置用四个值//告诉unity把模型空间下的顶点座标填充给vertex
				float3 normal : NORMAL;
                };
	            
	            //返回值的结构体
	            struct v2f {
					float4 position:SV_POSITION;
					float3 color : COLOR;
				};

				//顶点着色器//坐标转换
		        v2f vert(a2v v) {
				v2f f;
			    f.position = mul(UNITY_MATRIX_MVP,v.vertex);

				fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;//环境光

				//因为漫反射在顶点着色器里，不是片元着色器里，中间的颜色都是差值运算得到的，所以过度很粗糙有
				fixed3 normalDir = normalize(mul(v.normal, (float3x3) unity_WorldToObject));

				fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);//对于每个顶点来说 光的位置就是光的方向，因为光是平星光

				fixed3 diffuse = _LightColor0.rgb * max(dot(normalDir, lightDir), 0) * _Diffuse.rgb;//取的漫反射的颜色

				f.color = diffuse + ambient;

		     	return f;
                }

				//片元着色器//控制输出到屏幕上的颜色
		    	float4 frag(v2f f) :SV_Target{
				return fixed4(f.color,1);
                }


		     	ENDCG
            }
        }
		Fallback"VertexLit"
    }


//什么是光照模型
//光照模型就是一个公式，使用这个公式来计算在某个点的光照效果

//标准光照模型
//在标准光照模型里面，我们把进入摄像机的光分为下面四个部分
//自发光
//高光反射 Specular
//漫反射  Diffuse = 直射光颜色 * max(0 , cos夹角（光和法线的夹角）)
//环境光

//Tags{"LightMode"="ForwardBase"}
//只有定义了正确的LightMode才能得到Unity的内置光照变量
//include"Lighting.cginc"
//包含unity的内置的文件，才可以使用unity内置的一些变量

//normalize() 用来把一个向量，单位化(原来方向保持不变)
//max() 用来取得函数中最大的一个
//dot 用来取得两个向量的点积
//_WorldSpaceLightPos0 取得平行光的位置
//_LightColor0 取得平行光的颜色
//UNITY_LIGHTMODEL_AMBIENT 用来获取环境光